package com.today.cjl.sqlGen.impl

import com.today.cjl.sqlGen.enums.ArgsType._
import com.today.cjl.sqlGen.utils.{FileUtil, GenUtil}

/**
  * Created by cjl at 2018-09-04
  * Description: 
  * Changed: 
  */
object GenWithArgs extends GenUtil[Map[String, ArgsType]] {
  /**
    * id列表文件
    */
  private val ARGS_FILE: String = "tmp/args.txt"

  /**
    * sql模板路径  变量覆盖
    */
  override val TEMP_FILE: String = "tmp/template2.sql"
  /**
    * sql输出路径  变量覆盖
    */
  override val OUT_FILE: String = "tmp/out2.sql"

  override def gen(argument: Map[String, ArgsType]): Unit = {
    val args: List[List[Map[String, Any]]] = genArgs(argument)
    genSql(args)
  }

  /**
    * 多个参数列表 一组对应一个模板  一个Map对应一条sql
    * @return
    */
  def genArgs(typeMap: Map[String, ArgsType]): List[List[Map[String, Any]]] = {
    val lines: List[String] = FileUtil.readLine(ARGS_FILE)
    lineSeq(lines).map { (grp: List[String]) =>
      // split 后需要去除空格
      val arrList: List[Array[String]] = grp.map(_.split("\\|").map(_.trim))
      arrList match {
        case Nil => Nil
        case _ =>
          // 第一行 为 字段名
          val argNames: Array[String] = arrList.head
          // 参数名 有默认参数类型配置 或者 都有对应的类型
          assert(typeMap.contains(ARG_TYPE_DEFAULT) || (argNames.toSet -- typeMap.toSet).isEmpty)
          // 每一组
          arrList.tail.map { array: Array[String] =>
            assert(array.length == argNames.length)
            // 每一行
            (argNames zip array).map { case (name: String, value: String) =>
              val typeOpt: Option[ArgsType] = typeMap.get(name)
              val argsType: ArgsType = if (typeOpt.isDefined) typeOpt.get else typeMap(ARG_TYPE_DEFAULT)
              name -> convert(value, argsType)
            }.toMap
          }
      }
    }
  }
}
